#ifndef PKT_META_H
#define PKT_META_H

#include <stdint.h>
#include <string.h>
#include "mac_addr.h"
#include "ip_addr.h"
#include "pkt_link_def.h"

namespace secsmart_tcpip
{

// 报文方向宏定义
#define PKT_DIRECTION_UNKNOW 0
#define PKT_DIRECTION_CLIENT_TO_SERVER 1
#define PKT_DIRECTION_SERVER_TO_CLIENT 2

typedef struct packet_meta_s {
    uint16_t source; // 数据来源(暂时没有使用)
    uint16_t pkt_len; // 完整报文长度
    timeval timestamp; //时间戳

    // 二层信息
    LinkLayerType link_type; // 链路类型
    MacAddress smac;
    MacAddress dmac;
    uint16_t vlanid;
    uint32_t vni; // vxlan id
    
    // 三层(ip)信息
    uint16_t ip_offset; //ip 头偏移
    uint16_t ip_len; // 从ip头开始到报文结束
    uint8_t ip_version; // 4 OR 6
    uint8_t ip_protocol; // ip载荷协议
    uint16_t ip_id;
    uint16_t ip_frag_offset;
    uint16_t ip_hdr_len;
    bool ip_more_frag;
    IPAddress sip; // 网络序数据
    IPAddress dip; // 网络序数据
    IPAddress out_sip; // 隧道封装时的外层ip，网络序数据
    IPAddress out_dip; // 隧道封装时的外层ip，网络序数据
    
    // 四层（tcp/udp）信息
    uint16_t l4_offset; // tcp/udp 头偏移
    uint16_t sport;
    uint16_t dport;
    uint16_t l4_payload_len; // 4层载荷长度

    // 标记
    uint32_t in_tunnel : 1;
    uint32_t is_vxlan : 1;
    uint32_t direction : 2;
    uint32_t hit_server: 1;
    uint32_t reserved : 27;
    
    void clear() { memset(this, 0, sizeof(packet_meta_s)); }
} packet_meta_t;

} // namespace secsmart_tcpip

#endif